package chemtools_logica.BDL.SFBean;

import chemtools_logica.BDL.IL.BDL_SFProductoLocal;
import chemtools_logica.BDL.IR.BDL_SFProductoRemote;

import chemtools_logica.Beans.ProductoBean;

import chemtools_logica.Entidades.Graficoestado;
import chemtools_logica.Entidades.Insumo;
import chemtools_logica.Entidades.Producto;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless(name = "BDL_SFProducto", mappedName = "map-BDL_SFProducto")
public class BDL_SFProductoBean implements BDL_SFProductoRemote, BDL_SFProductoLocal {
    @Resource
    SessionContext sessionContext;
    @PersistenceContext(unitName = "Chemtools_Logica")
    private EntityManager em;

    public BDL_SFProductoBean() {
    }

    public Producto persistProducto(Producto producto) {
        em.persist(producto);
        return producto;
    }

    public Producto mergeProducto(Producto producto) {
        return em.merge(producto);
    }

    public void removeProducto(Producto producto) {
        producto = em.find(Producto.class, producto.getIdProducto());
        em.remove(producto);
    }

    /** <code>select o from Producto o</code> */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Producto> getProductoFindAll() {
        return em.createNamedQuery("Producto.findAll", Producto.class).getResultList();
    }
    
    public List<Producto> allProductos(){
        List<Producto> listaEntidad = new ArrayList<Producto>();
        
        String ejb = "SELECT u FROM Producto u JOIN FETCH u.empresa JOIN FETCH u.tipoproducto " +
                     "JOIN FETCH u.tipoproducto.medida";
        
        try{
            
            Query query = em.createQuery(ejb);
            listaEntidad = query.getResultList();
        }catch(Exception e){
            
            listaEntidad = null;
        }
        
        return listaEntidad;
    }
    
    public List<Producto> busquedaProducto(ProductoBean bean){
        List<Producto> listaEntidad = new ArrayList<Producto>();
        
        String ejb = "SELECT u FROM Producto u WHERE 1=1";
        
        if(bean.getIdProducto() != null){
           ejb += " AND u.idProducto like '%"+bean.getIdProducto()+"%'";
        }
        
        if(bean.getEstado() != -1){
           ejb += " AND u.estado = "+bean.getEstado();
        }
        if(bean.getCalidad() != -1){
           ejb += " AND u.calidad = "+bean.getCalidad();
        }
        
       
        if(bean.getFechaCreaciondMin() != null || bean.getFechaCreaciondMax()!= null){
            
            if(bean.getFechaCreaciondMax()!= null){
                   ejb += " AND u.fecha_Creacion  <= '"+bean.getFechaCreaciondMax()+"' ";
                }
            if(bean.getFechaCreaciondMin()!= null){
                   ejb += " AND u.fecha_Creacion >= '"+bean.getFechaCreaciondMin()+"' ";
                }
            
        }
        try{
            
            Query query = em.createQuery(ejb);
            listaEntidad = query.getResultList();
        }catch(Exception e){
            
            listaEntidad = null;
        }
        
        return listaEntidad;
    }
    
    public List<Producto> getAllProductosActivos(){
        List<Producto> listaEntidad = new ArrayList<Producto>();
        
        String ejb="SELECT u FROM Producto u";
        
        try{
        Query query = em.createQuery(ejb);
        listaEntidad = query.getResultList();
        }catch(Exception e){
            
            
        }
        
        return listaEntidad;
    }
    
    public boolean existeCodigoProducto(String codigo){
        boolean exi = false;
     
        String ejb = "SELECT u FROM Producto u WHERE u.idProducto = '"+codigo+"'";
        
        List<Producto> producto = new ArrayList<Producto>();
        Query query = em.createQuery(ejb);
        producto = query.getResultList();
        
        if(producto.size() == 0){
            exi = true;
        }       
        return exi;
    }
    
    public List<Graficoestado> CallProceduregraficoProductoEstado(String idAlmacen, Date fechaMin, Date fechaMax){
        List<Graficoestado> listaGrafico = new ArrayList<Graficoestado>();
        String ejbQuery = "{CALL graficoProductoEstado(?,?,?)}";
             Query query = em.createNativeQuery(ejbQuery, Graficoestado.class);
             query.setParameter(1, idAlmacen);
             query.setParameter(2, fechaMin);
             query.setParameter(3, fechaMax);
             listaGrafico = query.getResultList();
             
        return listaGrafico;
    }
    
}
